package grameball;

import java.awt.Color;
import java.awt.Font;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JLabel;

/**
 *Tale classe costruisce un tasto che verra utilizzato per il movimento del mirino.
 * Viene implementata l'interfaccia MouseListener per sovrascrivere i sui metodi ed assegnare tali 
 * eventi all'oggetto che tale classe costruira.
 * @author Meco.Klodian (Granad)
 */
public class GrandiosMove extends JLabel  implements MouseListener
{
    /**
     * Tale variabile viene utilizzata per ottenere la direzione in cui si sta facendo spostare il mirino
     * per permettere alla palla di fuggire in qualche modo da esso. Essa assume i valori "up", "down","left","right" e "" per quando è ferma.
     */
    public static String direzione = ""; 
    /**
     * Tale variabile statica di tipo booleana, viene utilizzata per conoscere l'eventuale utilizzo del mouse per lo
     * spostamento del mirino, per bloccare lo spostamento con la tastiera, in quanto se premuti entrambi, e senza questa variabile di controllo che l'impedisse
     * si otterrebbero piu Thread di movimento per il mirino, finalizzando un aumento della sua velocita ed una degenerazione nel movimento tale.
     * 
     */
    static boolean inUseMouse = false;
    /**
     * Larghezza del pulsante.
     */
    private int w;
    /**
     * Altezza del pulsante.
     */
    private int h;
    /**
     * Azione da far compiere al mirino, per quando sara sotto mouse.
     * 
     * Valori che puo assumere "up","down","left","right".
     */
    private String is;
    /**
     * Costruttore del Thread per il movimento del mirino. Inizializzato con 
     * l'evento mouseEntered e distrutto con l'evento mouseExited
     */
    private Thread move;
    /**
     * Stringa da inserire nel pulsante di movimento.
     */
    private String tast;
    private boolean mouseOn;
    public GrandiosMove(int w, int h,String who, Point xy)
    {

        setLocation(xy);
        this.w = w;
        this.h = h;
        is = who;
        mouseOn = false;
        setSize(w,h);
        addMouseListener(this);
        forTast();
    }
    /**
     * Scelta della stringa da impostare nel tasto di movimento.
     * Tale lettera inserita indica quella utilizzata dalla tastiera per ottenre il movimento.
     */
    private void forTast()
    {
        if(is.equals("up"))
            tast = "w";
        else if(is.equals("down"))
            tast = "s";
        else if(is.equals("left"))
            tast = "a";
        else if(is.equals("right"))
            tast = "d";
    }
    /**
     * Override del metodo paint della classe JLabel.
     * @param gg
     */
    @Override
    public void paint(Graphics gg)
    {
        Graphics2D g = (Graphics2D) gg; // pero ottenere una paletta completa per il disegno.
        g.setPaint(new GradientPaint(0,0,Color.GREEN,w,h,Color.BLUE)); //sfumature.
        if(mouseOn)
        {
            if(VisualFrame.pause)
                g.setPaint(new GradientPaint(0,0,Color.CYAN,w,h,Color.YELLOW)); //colore per Movimento pausato.
            else
                g.setPaint(new GradientPaint(0,0,Color.GRAY,w,h,Color.RED)); // colore per Movimento ok.
        }
        g.fillRect(0, 0, w, h); //disegno quando il mouse non è sopra.
        g.setColor(Color.BLACK);
        g.drawRect(0, 0, w-1, h-1); //controno del pulsante
        g.setColor(Color.RED);
        g.setFont(g.getFont().deriveFont(Font.BOLD)); //impostazione del font di scrittura. Scelta di un Bold.
        g.drawString(tast, 2, 10);//stringa 
    }

    public void mouseClicked(MouseEvent e) {}
    public void mousePressed(MouseEvent e) {}
    public void mouseReleased(MouseEvent e) {}
    /**
     * Tale medoto, attiva il movimento del mirino, abilita la variabile inUseMouse a true, per bloccare
     * l'utilzzo della tastiera, e per ottenere la modifica del colore del tasto, aggiornata col metodo di tipo void "repaint()"
     * @param e Catturatore d'evento.
     */
    public void mouseEntered(MouseEvent e)
    {
        direzione = is; //salvataggio della direzione in cui ci staimo direzionando.
        mouseOn = true;
        if(!VisualFrame.pause && move == null && !VisualFrame.inUseKey) //controllo di abilizaione o meno del movimento
        {
            inUseMouse = true;
            move = new MoveXO(is,VisualFrame.xy1,VisualFrame.x,15);
            move.start();
        }
        repaint();
    }

    /**
     * Blocca il movimento del mirino, bloccando il Thread fatto partire mediante il metodo mouseEntered
     * imposta la variabile inUseMouse a false per permettere l'utilizzo della tastiera per il movimento ed ottenere il ridisegno
     * del pulsante mediante il metodo "repaint()".
     * Imposta la variabile direzione a "" per indicare che ora il mirino è fermo.
     * @param e Catturatore d'evento.
     */
    public void mouseExited(MouseEvent e)
    {
        mouseOn = false;
        if(move != null)
        {
            inUseMouse = false;
            direzione = "";
            move.stop();
            move = null;
        } 
        repaint();
    }
}